/**
 * @file bsp_key.c
 * @author 何传喜
 * @brief 按键驱动文件
 * @version 0.1
 * @date 2023-08-31
 * 
 * @copyright Copyright (c) 2023
 * 
 */
#include "bsp_key.h"
#include "bsp_gpio.h"
#include "bsp_delay.h"

/**
 * @brief 初始化按键
 * @param 无
 * @return 无 
 */
void key_init(void)
{
    gpio_pin_config_t key_config;
    /* 1、初始化 IO 复用，复用为 GPIO1_IO18 */
    IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0);
    /* 2、配置 UART1_CTS_B 的 IO 属性
     * bit 16:0 HYS关闭
     * bit [15:14]:11 默认22K上拉
     * bit [13]：0 kepper功能
     * bit [12]: 1 pull/kepper使能
     * bit [11]: 0 关闭开路输出
     * bit [7:6]:10 速度100MHz
     * bit [5:3]:000 关闭输出
     * bit [0]: 0 低转换率
     */
    IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0xF080);
    /* 3、初始化 GPIO GPIO1_IO18 设置为输入 */
    key_config.direction = kGPIO_DigitalInput;
    gpio_init(GPIO1, 18, &key_config);
}

/**
 * @brief 获取按键值
 * @param 无
 * @return int 按键值。0，没有按键按下；其他值，对应的按键值
 */
int key_getvalue(void)
{
    int ret = 0;
    static unsigned char release = 1; /* 按键松开 */

    if ((release == 1) && (gpio_pinread(GPIO1, 18) == 0)) { /* KEY0 按下 */
        delay(10); /* 延时消抖 */
        release = 0; /* 标记按键按下 */
        if (gpio_pinread(GPIO1, 18) == 0) {
            ret = KEY0_VALUE;
        }
    } else { /* KEY0 未按下 */
        ret = 0;
        release = 1; /* 标记按键释放 */
    }
    
    return ret;
}
